#! python3
# 用 GUI 自动化控制键盘和鼠标
import time

import pyautogui

# 每个PyAutoGUI函数调用在执行动作之后，都会等待1秒。非 PyAutoGUI 指令不会停顿。
pyautogui.PAUSE = 1

# 启动自动防故障功能
# 自动防故障功能：将鼠标移到屏幕的左上角，这将导致 pyautogui 产生 pyautogui .FailSafeException 异常
pyautogui.FAILSAFE = True


def controlMose():
    """
    控制鼠标：屏幕左上角为原点
    :return:
    """
    try:
        # 移动鼠标
        # duration 整数或浮点数关键字参数，鼠标移到目的位置所需的秒数。
        # 如果不指定，默认值是零，表示立即移动。所有的 duration 关键字参数都是可选的
        # for i in range(3):
        #     pyautogui.moveTo(100, 100, duration=0.25)
        #     pyautogui.moveTo(200, 100, duration=0.25)
        #     pyautogui.moveTo(200, 200, duration=0.25)
        #     pyautogui.moveTo(100, 200, duration=0.25)

        # 获取鼠标位置
        # print('鼠标位置：', pyautogui.position())
        # i = 0
        # while i < 10:
        #     x, y = pyautogui.position()
        #     print('鼠标位置：', x, y, pyautogui.position())
        #     time.sleep(2)
        #     i += 1

        # 点击鼠标
        # pyautogui.*click(x, y)
        # pyautogui.click(300, 100)
        # pyautogui.doubleClick(100, 100)

        # 拖动鼠标
        # pyautogui.dragTo(470, 120, duration=0.25)  # 将鼠标拖动到一个新的位置
        # pyautogui.dragRel(100, 200, duration=0.25)  # 将鼠标拖动到一个相对当前位置的位置

        # 滚动鼠标：传递正整数表示向上滚动，传递负整数表示向下滚动
        pyautogui.scroll(200)

    except KeyboardInterrupt:
        print("鼠标移到了屏幕的左上角，已启动自动防故障功能!")
    except Exception as exc:
        print("异常：" + exc)


def screen():
    """
    处理屏幕
    :return:
    """
    # 获取屏幕快照
    im = pyautogui.screenshot()
    # print(im)
    print(im.getpixel((50, 200)))  # 图像中坐标处的像素颜色RGB

    # 分析屏幕快照
    # 屏幕上 x、y 坐标处的像素是否与指定的颜色匹配
    print(pyautogui.pixelMatchesColor(50, 200, (60, 63, 65)))
    print(pyautogui.pixelMatchesColor(50, 200, (60, 62, 65)))

    # 图像识别：
    # 屏幕上发现该图像时左边的 x 坐标、顶边的 y 坐标、宽度以及高度
    # 找不到图像返回None
    firstFind = pyautogui.locateOnScreen('setting.png')  # 匹配首次发现
    findAll = pyautogui.locateAllOnScreen('setting.png')  # 匹配所有
    print(firstFind)
    print(list(findAll))

    # 获取识别到的图像的中心坐标并用鼠标单击
    centerPoint = pyautogui.center(firstFind)
    print(centerPoint)
    pyautogui.click(centerPoint, duration=0.25)


def controlKeyBoard():
    """
    控制键盘
    :return:
    """
    # 通过键盘发送一个字符串
    time.sleep(2)  # 给点时间切换到记事本

    pyautogui.click(600, 650)  # 确保要输入的地方获得光标
    pyautogui.typewrite('Hello world!', 0.25)  # 输入文本，并控制打印速度

    # 发送代表键字符串的列表
    # 详见：表 18-1 PyKeyboard 属性
    pyautogui.typewrite(['a', 'b', 'left', 'left', 'X', 'Y', 'end', '\n'], 0.25)

    # 按下和释放键盘
    pyautogui.keyDown('shift')
    pyautogui.press('4')
    pyautogui.keyUp('shift')

    # 热键组合
    pyautogui.hotkey('ctrl', 'a')
    pyautogui.hotkey('ctrl', 'c')
    pyautogui.typewrite(['pagedown', 'end', '\n'], 0.25)
    pyautogui.hotkey('ctrl', 'v')

if __name__ == '__main__':
    # 取屏幕分辨率
    # width, height = pyautogui.size()
    # print('分辨率：', pyautogui.size(), width, height, sep='\n')

    # 控制鼠标
    # controlMose()

    # 识别屏幕
    # screen()

    # 控制键盘
    controlKeyBoard()

